package com.filedemo.controller;


import com.filedemo.entity.Files;
import com.filedemo.service.FilesService;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Controller
class FileUploadController {
    //注入service
    @Autowired
    private FilesService filesService;
    //文件上传操作
    @ResponseBody
    @RequestMapping("/fileUpload")
    public String fileUpload(@RequestParam("uploadfile") List<MultipartFile> uploadfile, HttpServletRequest request){
        //判断前端传送的表单文件是否为空
        if(!uploadfile.isEmpty() && uploadfile.size() > 0){
            //因为可能是多个文件--循环便利每一个文件
            for (MultipartFile file : uploadfile){
                //初始化文件类信息,使用MutipartFile的方法获取文件元信息
                Files files = new Files();
                //文件原始名
                files.setOriginalName(file.getOriginalFilename());
                //文件大小
                files.setSize(file.getSize());
                //文件上传时间
                files.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                //文件类型---内容类型,如果想要后缀,可以从文件名获取
                files.setType(file.getContentType());
                //创建文件上传的路径,文件夹名为当前的时间.
                String path = request.getSession().getServletContext().getRealPath("/"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+"/");
                //创建对应路径
                File filepath = new File(path);
                //如果不存在某一天的文件夹--就先创建
                if(!filepath.exists()){
                    filepath.mkdirs();
                }
                //文件保存目录
                files.setCataLog(path);
                //获取随机的文件UUID
                String[] split = file.getOriginalFilename().split("\\.");
                String newFilename = UUID.randomUUID()+"."+ split[split.length-1];
                files.setUUID(newFilename);
                try{
                    //文件上传到指定目录下
                    file.transferTo(new File(path+newFilename));
                }catch (Exception e){
                    e.printStackTrace();
                    //上传出错--返回给前端一个包含error的json
                    return "error";
                }
                //每上传完成一个--就向数据库添加对应的元信息
                filesService.addFile(files);
            }
            //上传成功--返回给前端一个包含success的json
            return "success";
        }else {
            //如果文件为空,或者个数小于0--返回给前端一个包含error的json,事实上前台已经做过校验,这里在进行一次更为安全.
            return "error";
        }
    }

    //文件下载操作,来自超链接的get请求,路径中包含---UUID
    @RequestMapping("/fileDownload")
    public ResponseEntity<byte[]> fileDownload(HttpServletRequest request, String fileUUID) throws IOException {
        //根据UUID获取对应的文件上传时间--目的是获取到上传当天的日期--定位到目录
        String[] times = filesService.queryFileByUUID(fileUUID).split(" ");
        String path = request.getSession().getServletContext().getRealPath("/"+times[0]+"/");
        //根据uuid和日期,创建下载路径--File.separator--对应操作系统的路径分割符
        File file = new File(path+ File.separator+fileUUID);
        HttpHeaders headers = new HttpHeaders();
        //设置http响应头---让http以下载的方式打开文件.
        headers.setContentDispositionFormData("attachment",fileUUID);
        //以流的方式下载返回的文件数据.
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //返回下载数据,使用spring mvc的ResponseEntity对象封装数据.
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
    }

    //查询所有的文件上传记录以及元信息,以json形式返回给前端,此方法由ajax调用
    @ResponseBody
    @RequestMapping("/queryAllFiles")
    public List<Files> queryAllFiles(){
        List<Files> files = filesService.queryAllFiles();
        return files;
    }

    //获取文件元信息--根据uuid--返回给前台json形式,此方法由ajax调用
    @ResponseBody
    @RequestMapping("/queryFileJSON")
    public Files queryFileJSON(String fileUUID){
        Files files = filesService.queryFileJSON(fileUUID);
        return files;
    }
}
